// Copyright(2011) ReportGear co., ltd.
/**
 * @fileOverview 业务基础开发平台-DOM操作-Dom操作
 */
sps.provide('sps.dom');

/**
 * DOM操作
 * 
 * @constructor
 */
sps.dom = {};

/**
 * 获取DOM元素
 * 
 * @param {string/HTMLElement}
 *            element 要获取的DOM元素
 */
sps.dom.getElement = function(element) {
	if (sps.lang.is(element, 'string')) {
		return document.getElementById(element);
	} else {
		return element;
	}
};

/**
 * 获取文档Body对象
 * 
 * @return {HTMLElement} BODY对象
 */
sps.dom.getBody = function() {
	return document.body;
};

/**
 * 创建DOM元素
 * 
 * @static
 * @param {object}
 *            info 需要创建的元素的信息
 * @return {HTMLElement} HTML对象
 */
sps.dom.createElement = function(info) {
	var el;
	var lang = sps.lang;

	if (lang.is(info, 'string')) {
		el = document.createTextNode(info);
	} else {
		el = document.createElement(info.tag);
		delete(info.tag);

		if (!lang.is(info.children, 'undefined')) {
			if (lang.is(info.children, 'string') || lang.is(info.children.length, 'undefined')) {
				el.appendChild(sps.$E(info.children));
			} else {
				for (var i = 0, child = null; !lang.is(child = info.children[i], 'undefined'); i++) {
					el.appendChild(sps.$E(child));
				}
			}
			delete(info.children);
		}

		for (attr in info) {
			el[attr] = info[attr];
		}
	}

	return el;
};

/**
 * 创建清除浮动DOM元素
 */
sps.dom.createCFDom = function() {
	var dom = sps.$E({
				tag : 'div'
			});

	dom.style.cssText = 'clear: both;float:none;';

	return dom;
};

/**
 * 给Dom对象添加样式类
 * 
 * @param {HTMLElement/String}
 *            o DOM对象
 * @param {String}
 *            className 样式名
 */
sps.dom.addClass = function(o, className) {
	var o = sps.$(o);
	if (o) {
		o.className = String.trim(o.className.replace(className, '')) + ' ' + className;
	}
};

/**
 * 移除Dom对象的样式类
 * 
 * @param {HTMLElement/String}
 *            o DOM对象
 * @param {String}
 *            className 样式名
 */
sps.dom.removeClass = function(o, className) {
	var o = sps.$(o);
	if (o) {
		o.className = String.trim(o.className.replace(className, ''));
	}
};

/**
 * 对象是否包含类
 * 
 * @param {HTMLElement/String}
 *            o DOM对象
 * @param {String}
 *            className 样式名
 * @returns {Boolean} 是否包含类
 */
sps.dom.hasClass = function(o, className) {
	return String.include(sps.$(o).className, className);
};

/**
 * 切换DOM对象的样式类，显示时样式类置于最后
 * 
 * @param {HTMLElement/String}
 *            o DOM对象
 * @param {String}
 *            className 样式名
 */
sps.dom.toggleClass = function(o, className) {
	var o = sps.$(o);
	var cls = o.className;

	if (cls.include(className)) {
		o.className = cls.replace(className, '').trim();
	} else {
		o.className = cls + ' ' + className;
	}
};

/**
 * 设置对象o的样式类，并且移除o的兄弟节点的此样式类
 * 
 * @param {HTMLElement/String}
 *            o DOM对象
 * @param {String}
 *            className 样式名
 */
sps.dom.radioClass = function(o, className) {
	var o = sps.$(o);

	var siblings = o.parentNode.childNodes;
	sps.$A(siblings).forEach(function(s) {
				if (s.nodeType == 1) {
					sps.dom.removeClass(s, className);
				}
			});

	this.addClass(o, className);
};

/**
 * 设置光标标在Dom上的事件处理
 * 
 * @param {HTMLElement}
 *            o 设置的目标对象
 * @param {Function}
 *            overFn 光标移上的处理函数
 * @param {Function}
 *            outFn 光标移除的处理函数
 * @param {Object}
 *            scopt 作用域
 */
sps.dom.hover = function(o, overFn, outFn, scope) {
	sps.event.Event.addListener(o, 'mouseover', overFn.bindAsEventListener(scope || this));
	sps.event.Event.addListener(o, 'mouseout', outFn.bindAsEventListener(scope || this));
};

/**
 * 获取视图的宽度
 * 
 * @param {Boolean}
 *            full 是否全部视图
 * @returns {Number} 宽度
 */
sps.dom.getViewWidth = function(full) {
	return full ? this.getDocumentWidth() : this.getViewportWidth();
};

/**
 * 获取视图的高度
 * 
 * @param {Boolean}
 *            full 是否全部视图
 * @returns {Number} 高度
 */
sps.dom.getViewHeight = function(full) {
	return full ? this.getDocumentHeight() : this.getViewportHeight();
};

sps.dom.getActualTop = function(el) {
	var el = sps.$(el);

	return el ? el.offsetTop : 0;
};

sps.dom.getActualLeft = function(el) {
	var el = sps.$(el);

	return el ? el.offsetLeft : 0;
};

sps.dom.getActualWidth = function(el) {
	var el = sps.$(el);

	return el ? el.offsetWidth : 0;
};

sps.dom.getActualHeight = function(el) {
	var el = sps.$(el);

	return el ? el.offsetHeight : 0;
};

/**
 * 获取文档宽度
 * 
 * @returns {Number} 宽度
 */
sps.dom.getDocumentWidth = function() {
	var scrollHeight = (document.compatMode != "CSS1Compat")
			? document.body.scrollHeight
			: document.documentElement.scrollHeight;
	return Math.max(scrollHeight, this.getViewportHeight());
};

/**
 * 获取文档高度
 * 
 * @returns {Number} 高度
 */
sps.dom.getDocumentHeight = function() {
	var scrollWidth = (document.compatMode != "CSS1Compat")
			? document.body.scrollWidth
			: document.documentElement.scrollWidth;
	return Math.max(scrollWidth, this.getViewportWidth());
};

/**
 * 获取视图宽度
 * 
 * @returns {Number} 宽度
 */
sps.dom.getViewportHeight = function() {
	if (sps.env.isIE) {
		return sps.env.isStrict
				? document.documentElement.clientHeight
				: document.body.clientHeight;
	} else {
		return self.innerHeight;
	}
};

/**
 * 获取视 高度
 * 
 * @returns {Number} 高度
 */
sps.dom.getViewportWidth = function() {
	if (sps.env.isIE) {
		return sps.env.isStrict ? document.documentElement.clientWidth : document.body.clientWidth;
	} else {
		return self.innerWidth;
	}
};

/**
 * 使对象居中，对象必须能够居中，否则没有效果
 * 
 * @param {HTMLElement/String}
 *            el 对象
 */
sps.dom.center = function(el) {
	try {
		var w = parseInt(sps.dom.getStyle(el, 'width')) || 0;
		var h = parseInt(sps.dom.getStyle(el, 'height')) || 0;

		sps.dom.setStyle(el, 'left', (sps.dom.getViewWidth() - w) / 2 + 'px');
		sps.dom.setStyle(el, 'top', (sps.dom.getViewHeight() - h) / 2) + 'px';
	} catch (e) {
		alert('sps.dom.center: 请设置宽度和高度');
	}
};

/**
 * 设置到左上方
 * 
 * @param {HTMLElement}
 *            el 需要设置的元素
 */
sps.dom.leftTop = function(el) {
	sps.dom.setStyle(el, 'left', '0px');
	sps.dom.setStyle(el, 'top', '0px');
};

/**
 * 设置元素的样式
 * 
 * @param {HTMLElement}
 *            o 设置的目标对象
 * @param {string}
 *            name 样式名称
 * @param {*}
 *            value 值
 */
sps.dom.style = function(o, name, value) {
	var o = sps.$(o);

	if (o) {
		if (value) {
			o.style[name] = value;
		} else {
			return o.style[name];
		}
	}
};

sps.dom.setStyle = function(o, name, value) {
	var o = sps.$(o);

	o && (o.style[name] = value);
};

sps.dom.getStyle = function(o, name) {
	var o = sps.$(o);

	return o.style[name];
}

sps.dom.toggleDisplay = function(o) {
	this.setVisible(o, !this.getVisible(o), 'block');
}

/**
 * 设置对象的可见性
 */
sps.dom.setVisible = function(o, visible) {
	sps.dom.setStyle(o, 'display', (visible ? '' : 'none'));
};

/**
 * 设置对象的可见性
 */
sps.dom.getVisible = function(o, visible) {
	return (sps.dom.getStyle(o, 'display') != 'none');
};

/**
 * 获取元素
 */
sps.$ = sps.dom.getElement;
/**
 * 创建元素
 */
sps.$E = sps.dom.createElement;
/**
 * 获取或设置样式
 */
sps.style = sps.dom.style;
